home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 9 / CDACTUAL9.iso / share / Dos / VARIOS / pascal / SWAG9605.DDD / 0032_Hypnotic Sinus Demo.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-05-31  |  15.8 KB  |  638 lines

  1. {$g+,x-,o-,q-,r-,s-,d-,l-,y-,a+,n-,e-,p-,t-,v-,y-}
  2. uses gru;
  3. const
  4.   add1=1;
  5.   add2=-1;
  6.   add3=-1;
  7.   sofs=75;
  8.   samp=75;
  9.   slen=255;
  10.   sprpic:array[0..15,0..15]of byte=(
  11.     (0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0),
  12.     (0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0),
  13.     (0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0),
  14.     (0,0,1,1,1,1,1,2,2,1,1,1,1,1,0,0),
  15.     (0,1,1,1,1,1,2,2,2,2,1,1,1,1,1,0),
  16.     (0,1,1,1,1,2,2,3,3,2,2,1,1,1,1,0),
  17.     (1,1,1,1,2,2,3,3,3,3,2,2,1,1,1,1),
  18.     (1,1,1,1,2,2,3,4,4,3,2,2,1,1,1,1),
  19.     (1,1,1,1,2,2,3,3,3,3,2,2,1,1,1,1),
  20.     (0,1,1,1,1,2,2,3,3,2,2,1,1,1,1,0),
  21.     (0,1,1,1,1,1,2,2,2,2,1,1,1,1,1,0),
  22.     (0,0,1,1,1,1,1,2,2,1,1,1,1,1,0,0),
  23.     (0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0),
  24.     (0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0),
  25.     (0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0),
  26.     (0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0));
  27. type
  28.   sinarray=array[0..slen]of word;
  29.  
  30. var
  31.   stab:sinarray; { Used to move shade bob. }
  32.   ctab:array[0..319] of byte;
  33.   stab1,stab2,stab3:array[0..255] of byte;
  34.   i,i1,i2,i3:word;
  35.   workp:pointer;
  36.   work:word;
  37.   timer:longint absolute $0040:$006c;
  38.   frame,t1,t2:longint;
  39.   pal1,pal2:paltype;
  40.  
  41. function keypressed:boolean; assembler;
  42. asm
  43.   mov ah, 01h
  44.   int 16h
  45.   mov ax, 00h
  46.   jz @1
  47.   inc ax
  48.   @1:
  49. end;
  50.  
  51. function readkey:char; assembler;
  52. asm
  53.   xor ah,ah
  54.   int 16h
  55. end;
  56.  
  57. procedure virtup;
  58. begin
  59.   getmem(workp,64000);
  60.   work:=seg(workp^);
  61.   clear386(work,0);
  62. end;
  63.  
  64. procedure virtdn;
  65. begin
  66.   work:=0;
  67.   freemem(workp,64000);
  68. end;
  69.  
  70. procedure calcsinus;
  71. begin
  72.   for i:=0 to slen do stab[i]:=round(sin(i*4*pi/slen)*samp)+sofs;
  73.   for i:=0 to 255 do begin
  74.     stab1[i]:=round(sin(i*2*pi/255)*50)+109;
  75.     stab2[i]:=round(cos(i*4*pi/255)*25);
  76.     stab3[i]:=round(sin(i*4*pi/255)*25);
  77.   end;
  78.   fillchar(ctab,sizeof(ctab),0);
  79.   i1:=0; i2:=25; i3:=100;
  80. end;
  81.  
  82. procedure init;
  83. begin
  84.   virtup;
  85.   calcsinus;
  86.   frame:=0;
  87. end;
  88.  
  89. procedure volplot(x,y,where:word;c:byte);
  90. begin
  91.   plot2(x,y,where,c);
  92.   plot2(x+1,y,where,c+1);
  93.   plot2(x,y+1,where,c+2);
  94.   plot2(x+1,y+1,where,c+3);
  95. end;
  96.  
  97. procedure volsmoth(x,y,where:word);
  98. begin
  99.   smooth1(x,y,where);
  100.   smooth1(x+1,y,where);
  101.   smooth1(x,y+1,where);
  102.   smooth1(x+1,y+1,where);
  103. end;
  104.  
  105. function abort:boolean;
  106. begin
  107.   abort:=(keypressed)and(readkey=#27);
  108. end;
  109.  
  110. procedure waves;
  111. var
  112.   x,y,s,e,loops:word;
  113.   done,dir:boolean;
  114. begin
  115.   s:=159;
  116.   e:=161;
  117.   done:=false;
  118.   repeat
  119.     clear386(work,0);
  120.     for i:=s to e do
  121.     begin
  122.       ctab[i]:=stab1[(i+i1) mod 255]+stab2[(i+i2) mod 255]+stab3[(i+i3) mod 255];
  123.       volplot(i,ctab[i],work,ctab[i]);
  124.       smooth1(i-1,ctab[i]-1,work);
  125.       smooth1(i-1,ctab[i],work);
  126.       smooth1(i-1,ctab[i]-1,work);
  127.       smooth1(i+1,ctab[i]+1,work);
  128.       smooth1(i+1,ctab[i],work);
  129.       smooth1(i,ctab[i]+1,work);
  130.       smooth1(i-1,ctab[i]+1,work);
  131.       smooth1(i+1,ctab[i]-1,work);
  132.       smooth1(i,ctab[i],work);
  133.     end;
  134.     i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
  135.     flip386(work,vidseg);
  136.     if(frame mod 3)=0 then
  137.     begin
  138.       if(s>1)then dec(s);
  139.       if(e<318)then inc(e);
  140.     end;
  141.     inc(frame);
  142.     if(s<=1)and(e>=318)then done:=true;
  143.   until(done)or(abort);
  144.   done:=false;
  145.   s:=0;
  146.   repeat
  147.     clear386(work,0);
  148.     done:=true;
  149.     for i:=0 to 319 do
  150.     begin
  151.       if(ctab[i]>0)then done:=false;
  152.       plot2(i,ctab[i],work,ctab[i]);
  153.       smooth1(i-1,ctab[i]-1,work);
  154.       smooth1(i-1,ctab[i],work);
  155.       smooth1(i-1,ctab[i]-1,work);
  156.       smooth1(i+1,ctab[i]+1,work);
  157.       smooth1(i+1,ctab[i],work);
  158.       smooth1(i,ctab[i]+1,work);
  159.       smooth1(i-1,ctab[i]+1,work);
  160.       smooth1(i+1,ctab[i]-1,work);
  161.       smooth1(i,ctab[i],work);
  162.       if(ctab[i]>0)then dec(ctab[i]);
  163.     end;
  164.     inc(frame);
  165.     flip386(work,vidseg);
  166.   until(done)or(abort);
  167.   done:=false;
  168.   s:=159; e:=161;
  169.   repeat
  170.     clear386(work,0);
  171.     for i:=s to e do
  172.     begin
  173.       ctab[i]:=stab1[(i+i1) mod 255]+stab2[(i+i2) mod 255]+stab3[(i+i3) mod 255];
  174.       vline2(i,0,ctab[i],work,ctab[i]);
  175.       vline2(i,ctab[i],199,work,not(ctab[i]+40));
  176.       smooth1(i-1,ctab[i]-1,work);
  177.       smooth1(i-1,ctab[i],work);
  178.       smooth1(i-1,ctab[i]-1,work);
  179.       smooth1(i+1,ctab[i]+1,work);
  180.       smooth1(i+1,ctab[i],work);
  181.       smooth1(i,ctab[i]+1,work);
  182.       smooth1(i-1,ctab[i]+1,work);
  183.       smooth1(i+1,ctab[i]-1,work);
  184.       smooth1(i,ctab[i],work);
  185.     end;
  186.     flip386(work,vidseg);
  187.     if(frame mod 3)=0 then
  188.     begin
  189.       if(s>1)then dec(s);
  190.       if(e<318)then inc(e);
  191.     end;
  192.     inc(frame);
  193.     i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
  194.     if(s<=1)and(e>=318)then done:=true;
  195.   until(done)or(abort);
  196.   done:=false;
  197.   s:=99; e:=101;
  198.   repeat
  199.     clear386(work,0);
  200.     for i:=s to e do
  201.     begin
  202.       ctab[i]:=stab1[(i+i1) mod 255]+stab2[(i+i2) mod 255]+stab3[(i+i3) mod 255];
  203.       hline2(0,ctab[i]+99,i,work,ctab[i]);
  204.       hline2(ctab[i]+99,319,i,work,not(ctab[i]+40));
  205.     end;
  206.     for i:=0 to 319 do
  207.     begin
  208.       smooth1(i,s,work);
  209.       smooth1(i,e,work);
  210.       smooth1(i,s+1,work);
  211.       smooth1(i,e-1,work);
  212.     end;
  213.     flip386(work,vidseg);
  214.     if(frame mod 3)=0 then
  215.     begin
  216.       if(s>1)then dec(s);
  217.       if(e<198)then inc(e);
  218.     end;
  219.     inc(frame);
  220.     i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
  221.     if(s<=1)and(e>=198)then done:=true;
  222.   until(done)or(abort);
  223.   done:=false;
  224.   loops:=0;
  225.   i:=0;
  226.   repeat
  227.     smooth(work);
  228.     flip386(work,vidseg);
  229.     inc(frame);
  230.     inc(i);
  231.     done:=(i>=299);
  232.   until(done)or(abort);
  233.   done:=false;
  234.   dir:=true;
  235.   i:=0;
  236.   clear386(work,0);
  237.   repeat
  238.     ctab[i]:=stab1[(i+i1) mod 255]+stab2[(i+i2) mod 255]+stab3[(i+i3) mod 255];
  239.     volplot(i,ctab[i]-5,work,ctab[i]);
  240.     if(dir)then inc(i)else dec(i);
  241.     if(i>=318)or(i<=0)then dir:=not(dir);
  242.     smooth(work);
  243.     flip386(work,vidseg);
  244.     i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
  245.     done:=(loops>=990);
  246.     inc(frame);
  247.     inc(loops);
  248.   until(done)or(abort);
  249.   done:=false;
  250.   dir:=true;
  251.   i:=0;
  252.   loops:=0;
  253.   repeat
  254.     ctab[i]:=stab1[(i+i1) mod 255]+stab2[(i+i2) mod 255]+stab3[(i+i3) mod 255];
  255.     line2(0,0,i,ctab[i],work,ctab[i]);
  256.     smooth(work);
  257.     if(dir)then inc(i)else dec(i);
  258.     if(i>=318)or(i<=0)then dir:=not(dir);
  259.     flip386(work,vidseg);
  260.     i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
  261.     done:=(loops>=960);
  262.     inc(frame);
  263.     inc(loops);
  264.   until(done)or(abort);
  265.   done:=false;
  266.   i:=0;
  267.   repeat
  268.     smooth(work);
  269.     flip386(work,vidseg);
  270.     inc(frame);
  271.     done:=(i>=230);
  272.     inc(i);
  273.   until(done)or(abort);
  274. end;
  275.  
  276. procedure bobs;
  277. var
  278.   loop,cnt:longint;
  279.   x,y,x2,y2,x3,y3:integer;
  280.   i,j,i2,j2,i3,j3:byte;
  281.   dir,done:boolean;
  282. begin
  283.   getvgapal(pal1);
  284.   for i:=1 to 255 do
  285.   begin
  286.     with pal2[i]do
  287.     begin
  288.       r:=(i shl 2)+25;
  289.       g:=(i shl 1)-1;
  290.       b:=i;
  291.     end;
  292.   end;
  293.   f2black(pal1);
  294.   clear386(work,0);
  295.   i:=0;
  296.   j:=25;
  297.   for cnt:=0 to 199 do
  298.   begin
  299.     x:=2*stab[i];
  300.     y:=stab[j];
  301.     inc(i);
  302.     inc(j);
  303.     drawsprite(x,y,work,16,16,0,sprpic);
  304.   end;
  305.   flip386(work,vidseg);
  306.   ffblack(pal2);
  307.   i:=0;
  308.   j:=25;
  309.   dir:=false;
  310.   done:=false;
  311.   loop:=0;
  312.   repeat
  313.     x:=2*stab[i];
  314.     y:=stab[j];
  315.     inc(i);
  316.     inc(j);
  317.     drawsprite(x,y,work,16,16,0,sprpic);
  318.     dir:=not(dir);
  319.     if(dir)then smooth(work);
  320.     flip386(work,vidseg);
  321.     inc(frame);
  322.     inc(loop);
  323.     done:=(loop>=500);
  324.   until(abort)or(done);
  325.   { End of the first comet bob. }
  326.   i:=0;   j:=25;
  327.   i2:=50; j2:=70;
  328.   dir:=false;
  329.   done:=false;
  330.   loop:=0;
  331.   clear386(work,0);
  332.   repeat
  333.     x:=2*stab[i];   y:=stab[j];
  334.     x2:=2*stab[i2]; y2:=stab[j2];
  335.     inc(i);  inc(j);
  336.     inc(i2); inc(j2);
  337.     drawsprite(x,y,work,16,16,0,sprpic);
  338.     drawsprite(x2,y2,work,16,16,0,sprpic);
  339.     dir:=not(dir);
  340.     if(dir)then smooth(work);
  341.     flip386(work,vidseg);
  342.     inc(frame);
  343.     inc(loop);
  344.     done:=(loop>=500);
  345.   until(abort)or(done);
  346.   { end of the second comet bob }
  347.   i:=0;   j:=25;
  348.   i2:=50; j2:=60;
  349.   i3:=50; j3:=0;
  350.   dir:=false;
  351.   done:=false;
  352.   loop:=0;
  353.   clear386(work,0);
  354.   repeat
  355.     x:=2*stab[i];   y:=stab[j];
  356.     x2:=2*stab[i2]; y2:=stab[j2];
  357.     x3:=2*stab[i3]; y3:=stab[j3];
  358.     inc(i);  inc(j);
  359.     inc(i2); dec(j2);
  360.     dec(i3); inc(j3);
  361.     drawsprite(x,y,work,16,16,0,sprpic);
  362.     drawsprite(x2,y2,work,16,16,0,sprpic);
  363.     drawsprite(x3,y3,work,16,16,0,sprpic);
  364.     dir:=not(dir);
  365.     if(dir)then smooth(work);
  366.     flip386(work,vidseg);
  367.     inc(frame);
  368.     inc(loop);
  369.     done:=(loop>=500);
  370.   until(abort)or(done);
  371.   { end of the third comet bob. This one have THREE bobs! }
  372.   i:=0;   j:=25;
  373.   dir:=false;
  374.   done:=false;
  375.   loop:=0;
  376.   clear386(work,0);
  377.   repeat
  378.     x:=2*stab[i];   y:=stab[j];
  379.     inc(i);  inc(j);
  380.     line2(0,0,x+8,y+8,work,2);
  381.     line2(319,0,x+8,y+8,work,4);
  382.     line2(0,199,x+8,y+8,work,2);
  383.     line2(319,199,x+8,y+8,work,4);
  384.     drawsprite(x,y,work,16,16,0,sprpic);
  385.     dir:=not(dir);
  386.     if(dir)then smooth(work);
  387.     flip386(work,vidseg);
  388.     inc(frame);
  389.     inc(loop);
  390.     done:=(loop>=800);
  391.   until(abort)or(done);
  392.   { End of the tracking fire bob. }
  393.   getvgapal(pal1);
  394.   f2black(pal1);
  395.   { Fade to black }
  396. end;
  397.  
  398. procedure bobwaves;
  399. {
  400.   This is gonna be a SHORT "chapter"!
  401.   And it's not going to cover ONLY sinus-bobs.
  402. }
  403. const
  404.   maxtrail:word=3;
  405. var
  406.   c,x,y,x2,y2,x3,y3:integer;
  407.   loop,cnt:longint;
  408.   dir,done:boolean;
  409.   i,j:byte;
  410.  
  411. begin
  412.   for i:=1 to 255 do
  413.   begin
  414.     with pal1[i]do
  415.     begin
  416.       r:=i*3;
  417.       g:=i*3;
  418.       b:=i*3;
  419.     end;
  420.   end;
  421.   clear386(work,0);
  422.   clear386(vidseg,0);
  423.   setvgapal(pal1);
  424.   done:=false;
  425.   loop:=0;
  426.   repeat
  427.     clear386(work,0);
  428.     for i:=0 to (184 shr 1)do
  429.     begin
  430.       ctab[i]:=stab1[(i+i1) mod 255]+stab2[(i+i2) mod 255]+stab3[(i+i3) mod 255];
  431.       x:=ctab[i]+90;
  432.       y:=(i);
  433.       drawsprite(x,y shl 1,work,16,16,0,sprpic);
  434.     end;
  435.     for i:=0 to (303 shr 1) do
  436.     begin
  437.       ctab[i]:=stab1[(i+i1) mod 255]+stab2[(i+i2) mod 255]+stab3[(i+i3) mod 255];
  438.       x:=i;
  439.       y:=ctab[i];
  440.       drawsprite(x shl 1,y,work,16,16,0,sprpic);
  441.     end;
  442.     i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
  443.     flip386(work,vidseg);
  444.     inc(frame);
  445.     inc(loop);
  446.     done:=(loop>=1000);
  447.   until(done)or(abort);
  448.   { End of the first double-sinus-bob. }
  449.   clear386(work,0);
  450.   clear386(vidseg,0);
  451.   done:=false;
  452.   loop:=0;
  453.   repeat
  454.     clear386(work,0);
  455.     for c:=0 to 319 do
  456.       ctab[c]:=stab1[(c+i1) mod 255]+stab2[(c+i2) mod 255]+stab3[(c+i3) mod 255];
  457.     line2(0,ctab[0],319,ctab[319],work,10);
  458.     line2(ctab[0]+30,0,ctab[199],199,work,10);
  459.     drawsprite(ctab[160],ctab[99],work,16,16,0,sprpic);
  460.     drawsprite(ctab[99],ctab[160],work,16,16,0,sprpic);
  461.     drawsprite(ctab[1],ctab[200],work,16,16,0,sprpic);
  462.     drawsprite(ctab[200],ctab[1],work,16,16,0,sprpic);
  463.     i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
  464.     flip386(work,vidseg);
  465.     inc(frame);
  466.     inc(loop);
  467.     done:=(loop>=2000);
  468.   until(done)or(abort);
  469.   { End of the first sinus-line bob show. }
  470.   clear386(work,0);
  471.   clear386(vidseg,0);
  472.   done:=false;
  473.   loop:=0;
  474.   repeat
  475.     for c:=0 to 319 do
  476.       ctab[c]:=stab1[(c+i1) mod 255]+stab2[(c+i2) mod 255]+stab3[(c+i3) mod 255];
  477.     line2(0,ctab[0],319,ctab[319],work,10);
  478.     line2(ctab[0]+30,0,ctab[199],199,work,10);
  479.     drawsprite(ctab[160],ctab[99],work,16,16,0,sprpic);
  480.     drawsprite(ctab[99],ctab[160],work,16,16,0,sprpic);
  481.     drawsprite(ctab[1],ctab[200],work,16,16,0,sprpic);
  482.     drawsprite(ctab[200],ctab[1],work,16,16,0,sprpic);
  483.     i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
  484.     smooth(work);
  485.     flip386(work,vidseg);
  486.     inc(frame);
  487.     inc(loop);
  488.     done:=(loop>=1000);
  489.   until(done)or(abort);
  490.   { End of the smoothed sinus-line bob show. }
  491.   getvgapal(pal1);
  492.   for i:=1 to 255 do
  493.   begin
  494.     with pal2[i]do
  495.     begin
  496.       r:=(i shl 2)+25;
  497.       g:=(i shl 1)-1;
  498.       b:=i;
  499.     end;
  500.   end;
  501.   fadefrompaltopal(pal1,pal2);
  502.   done:=false;
  503.   loop:=0;
  504.   repeat
  505.     for c:=0 to 319 do
  506.       ctab[c]:=stab1[(c+i1) mod 255]+stab2[(c+i2) mod 255]+stab3[(c+i3) mod 255];
  507.     line2(0,ctab[0],319,ctab[319],work,5);
  508.     line2(ctab[0]+30,0,ctab[199],199,work,5);
  509.     drawsprite(ctab[160],ctab[99],work,16,16,0,sprpic);
  510.     drawsprite(ctab[99],ctab[160],work,16,16,0,sprpic);
  511.     drawsprite(ctab[1],ctab[200],work,16,16,0,sprpic);
  512.     drawsprite(ctab[200],ctab[1],work,16,16,0,sprpic);
  513.     i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
  514.     smooth(work);
  515.     line2(0,199,319,199,work,0);
  516.     flip386(work,vidseg);
  517.     inc(frame);
  518.     inc(loop);
  519.     done:=(loop>=1000);
  520.   until(done)or(abort);
  521.   { End of the smoothed sinus-line bob with fire colors show. }
  522.   done:=false;
  523.   loop:=0;
  524.   cnt:=0;
  525.   getvgapal(pal1);
  526.   for i:=1 to 255 do
  527.   begin
  528.     with pal2[i]do
  529.     begin
  530.       r:=i;
  531.       g:=sqr(i);
  532.       b:=(i shl 2)+25;
  533.     end;
  534.   end;
  535.   fadefrompaltopal(pal1,pal2);
  536.   clear386(work,0);
  537.   clear386(vidseg,0);
  538.   repeat
  539.     for c:=0 to 319 do
  540.       ctab[c]:=stab1[(c+i1) mod 255]+stab2[(c+i2) mod 255]+stab3[(c+i3) mod 255];
  541.     line2(0,ctab[0],319,ctab[319],work,(i mod 3)+5);
  542.     line2(ctab[0]+30,0,ctab[199],199,work,(i mod 3)+4);
  543.     line2(0,199,319,199,work,0);
  544.     i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
  545.     inc(cnt);
  546.     if(cnt>=maxtrail)then
  547.     begin
  548.       smooth(work);
  549.       cnt:=0;
  550.     end;
  551.     flip386(work,vidseg);
  552.     inc(frame);
  553.     inc(loop);
  554.     done:=(loop>=1500);
  555.   until(done)or(abort);
  556.   { End of the traily line. }
  557.   i:=0;
  558.   j:=25;
  559.   c:=0;
  560.   loop:=0;
  561.   done:=false;
  562.   clear386(work,0);
  563.   repeat
  564.     if(c>4)then
  565.     begin
  566.       c:=0;
  567.       smooth(work);
  568.       line2(160,100,x,y,work,8);
  569.     end;
  570.     x:=2*stab[i];
  571.     y:=stab[j];
  572.     inc(i);
  573.     inc(j);
  574.     drawsprite(x,y,work,16,16,0,sprpic);
  575.     line2(0,0,319,0,work,0);
  576.     line2(0,0,0,199,work,0);
  577.     line2(0,199,319,199,work,0);
  578.     line2(319,199,319,0,work,0);
  579.     flip386(work,vidseg);
  580.     done:=(loop>1500);
  581.     inc(c);
  582.     inc(loop);
  583.   until(done)or(abort);
  584.   { Okay, maybe not exactly a bob-line, but it still rock! ;-) }
  585.   clear386(work,0);
  586.   clear386(vidseg,0);
  587.   done:=false;
  588.   dir:=false;
  589.   loop:=0;
  590.   repeat
  591.     clear386(work,0);
  592.     for c:=0 to 319 do
  593.       ctab[c]:=stab1[(c+i1) mod 255]+stab2[(c+i2) mod 255]+stab3[(c+i3) mod 255];
  594.     line2(0,ctab[0],319,ctab[319],work,3);
  595.     line2(ctab[0]+30,0,ctab[199],199,work,3);
  596.     line2(0,ctab[319],319,ctab[0],work,30);
  597.     line2(ctab[199],0,ctab[0],199,work,30);
  598.     line2(0,ctab[160],319,ctab[99],work,50);
  599.     line2(ctab[99],0,ctab[160],199,work,50);
  600.     drawsprite(ctab[160],ctab[99],work,16,16,0,sprpic);
  601.     drawsprite(ctab[99],ctab[160],work,16,16,0,sprpic);
  602.     drawsprite(ctab[1],ctab[200],work,16,16,0,sprpic);
  603.     drawsprite(ctab[200],ctab[1],work,16,16,0,sprpic);
  604.     drawsprite(ctab[100],ctab[10],work,16,16,0,sprpic);
  605.     drawsprite(ctab[10],ctab[199],work,16,16,0,sprpic);
  606.     drawsprite(ctab[300],ctab[50],work,16,16,0,sprpic);
  607.     drawsprite(ctab[50],ctab[100],work,16,16,0,sprpic);
  608.     i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
  609.     flip386(work,vidseg);
  610.     inc(frame);
  611.     inc(loop);
  612.     done:=(loop>=2300);
  613.   until(done)or(abort);
  614.   { End of retarded crosses with EIGHT bobs show. }
  615. end;
  616.  
  617. procedure main;
  618. begin
  619.   init;
  620.   setmode($13);
  621.   for i:=1 to 199 do setpal(i,i div 4,20+i div 5,10+i div 6);
  622.   t1:=timer;
  623.   waves;
  624.   bobs;
  625.   bobwaves;
  626.   t2:=(timer-t1);
  627.   setmode($03);
  628.   writeln('SiNUS "DEMO". Whatever. Coded by Sune Marcher');
  629.   writeln('You saw ',frame,' of the demos frames.');
  630.   writeln('It took ',(t2/18.2):0:1,' seconds.');
  631.   writeln('  (',((t2/18.2)/60):0:1,' minutes).');
  632.   writeln(round((frame*18.2)/t2),' fps.');
  633.   virtdn;
  634. end;
  635.  
  636. begin
  637.   main;
  638. end.